/**
 * @name: 公共方法封装
 * @date: 2020.2.13
 */
import Vue from 'vue'
import CryptoJS from "crypto-js"
import Cache from "./min-cache.js"
import {
	BigNumber
} from "bignumber.js";

var _this = new Vue();
const cache = new Cache()

//路径跳转-navigateTo
function navigateTo(path) {
	uni.navigateTo({
		url: path
	})
}

//弹窗提示-showToast-public
function showToast(msg) {
	uni.showModal({
		content: msg,
		showCancel: false
	})
}

//弹窗提示-showToast-success
function successToast(msg) {
	uni.showToast({
		title: msg,
		mask: true,
		duration: _this.$tmp.TIME_SUC
	})
}

//拨打电话
function callTel(tel) {
	uni.makePhoneCall({
		phoneNumber: tel
	})
}

//根据目的地经纬度导航
function navStart(la, lo) {
	uni.openLocation({
		latitude: la,
		longitude: lo
	})
}

//将数组转为逗号分隔的字符串
function arrToStr(arr) {
	let str = JSON.stringify(arr);
	str = str.replace(/\[/g, '');
	str = str.replace(/\]/g, '');
	return str.replace(/"/g, '');
}

//成功操作后返回上一页
function sucBack(n) {
	let m = !n ? 1 : n;
	setTimeout(() => {
		uni.navigateBack({
			delta: m
		})
	}, _this.$tmp.TIME_SUC);
}

/**
 * 带小数计算，保证精度
 * 把小数放大为整数(乘)，进行算术运算，再缩小为小数(除)
 * @param a {number} 运算数1
 * @param b {number} 运算数2
 * @param op {string} 运算类型，有加减乘除
 */
function operation(a, op, b) {
	let resu = 0; //运算后的结果
	let num1 = new BigNumber(a);
	let num2 = new BigNumber(b);
	switch (op) {
		case '+':
			resu = num1.plus(num2);
			break;
		case '-':
			resu = num1.minus(num2);
			break;
		case '*':
			resu = num1.multipliedBy(num2);
			break;
		case '/':
			resu = num1.dividedBy(num2);
			break;
	}
	resu = resu.toFormat(2);
	resu = resu.replace(/\,/g, '');
	console.log(resu);
	let str = resu.toString();
	let index = str.indexOf('.');
	if (index > -1) {
		//只截取两位小数，不进行四舍五入
		str = str.substring(0, (index + 3));
		resu = parseFloat(str);
	}
	return resu;
}

//判断是否有首页，如果没有，则代表是从分享页进入的
function hasIndex() {
	let a = getCurrentPages();
	let b = a[0].route == 'pages/index/index' ? true : false;
	return b;
}

//判断是否为安卓系统
function isAndroid() {
	let a = uni.getSystemInfoSync().platform;
	let b = a == 'ios' ? false : true;
	return b;
}

//获取今天日期
function getToday() {
	let date = new Date();
	let year = date.getFullYear();
	let month = (date.getMonth() + 1).toString().padStart(2, '0');
	let day = date.getDate().toString().padStart(2, '0');
	return year + '-' + month + '-' + day;
}

/**
 * 地图两点间距离计算
 * @desc 由经纬度计算两点之间的距离，la为latitude缩写，lo为longitude
 * @param la1 第一个坐标点的纬度
 * @param lo1 第一个坐标点的经度
 * @param la2 第二个坐标点的纬度
 * @param lo2 第二个坐标点的经度
 * @return (int)s   返回距离(单位千米或公里)
 * @tips 注意经度和纬度参数别传反了，经度为0~180、纬度为0~90
 */
function mapDistance(la1, lo1, la2, lo2) {
	let La1 = la1 * Math.PI / 180.0;
	let La2 = la2 * Math.PI / 180.0;
	let La3 = La1 - La2;
	let Lb3 = lo1 * Math.PI / 180.0 - lo2 * Math.PI / 180.0;
	let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) +
		Math.cos(La1) * Math.cos(La2) * Math.pow(Math.sin(Lb3 / 2), 2)));
	s = s * 6378.137;
	s = Math.round(s * 10000) / 10000;
	s = s.toFixed(1);
	return s;
}

function urlTojson(url) {
	let obj = {},
		index = url.indexOf('?'), // 看url有没有参数
		params = url.substr(index + 1); // 截取url参数部分 id = 1 & type = 2

	if (index != -1) { // 有参数时
		let parr = params.split('&'); // 将参数分割成数组 ["id = 1 ", " type = 2"]
		for (let i of parr) { // 遍历数组
			let arr = i.split('='); // 1） i id = 1   arr = [id, 1]  2）i type = 2  arr = [type, 2]
			obj[arr[0]] = arr[1]; // obj[arr[0]] = id, obj.id = 1   obj[arr[0]] = type, obj.type = 2
		}
	}
	return obj;
}
/**
 * 注意 encode 和 decode 方法中的aseKey 必须一样，并且不能修改
 * 注意 encode 和 decode 方法中的aseKey 必须一样，并且不能修改
 * 注意 encode 和 decode 方法中的aseKey 必须一样，并且不能修改
 */
function encode(message) {
	const aseKey = "tbyc1234" //秘钥必须为：8/16/32位
	if (typeof message != "string") {
		message = String(message);
	}
	//加密 DES/AES切换只需要修改 CryptoJS.AES <=> CryptoJS.DES
	var encryptMsg = CryptoJS.AES.encrypt(message, CryptoJS.enc.Utf8.parse(aseKey), {
		mode: CryptoJS.mode.ECB,
		padding: CryptoJS.pad.Pkcs7
	}).toString();
	return encryptMsg;
}

function decode(encryptMsg) {
	const aseKey = "tbyc1234" //秘钥必须为：8/16/32位
	//解密
	var decryptMsg = CryptoJS.AES.decrypt(encryptMsg, CryptoJS.enc.Utf8.parse(aseKey), {
		mode: CryptoJS.mode.ECB,
		padding: CryptoJS.pad.Pkcs7
	}).toString(CryptoJS.enc.Utf8);
	return decryptMsg;
}
Vue.prototype.$navigateTo = navigateTo;
Vue.prototype.$showToast = showToast;
Vue.prototype.$successToast = successToast;
Vue.prototype.$callTel = callTel;
Vue.prototype.$navStart = navStart;
Vue.prototype.$arrToStr = arrToStr;
Vue.prototype.$sucBack = sucBack;
Vue.prototype.$operation = operation;
Vue.prototype.$hasIndex = hasIndex;
Vue.prototype.$isAndroid = isAndroid;
Vue.prototype.$getToday = getToday;
Vue.prototype.$mapDistance = mapDistance;
Vue.prototype.$urlTojson = urlTojson;
Vue.prototype.$decode = decode;
Vue.prototype.$encode = encode;
Vue.prototype.$systeminfo = uni.getSystemInfoSync();
Vue.prototype.$cache = cache;
Vue.filter('toFixed2', (val) => {
	return val.toFixed(2);
})
// 2020-11-06 08:00:00 格式化时间，去除分钟后面的内容
Vue.filter('timeFormat', (time) => {
	let arr = time.split(' ');
	if (arr.length < 2) return time;
	let arr2 = arr[1].split(':')
	if (arr2.length < 3) return time;
	return `${arr[0]} ${arr2[0]}:${arr2[1]}`;
})
